package util;

import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;

import bean.Configuracao;
import bean.Preference;

public class PersistenciaXml {	
	private List<String> seriais = null;
	
	public void salvaPreferences(Preference preference){
        Element elemento = new Element(Constantes.XML_PREFERENCE_ELEMENT);
        Document doc = new Document(elemento);
        
        elemento.removeContent();
		
		Element idioma = new Element(Constantes.XML_IDIOMA_ELEMENT);		
		idioma.setText(preference.getIdioma());
		
		elemento.addContent(idioma);
		
		XMLOutputter xout = new XMLOutputter();
		try {
			FileWriter arquivo = new FileWriter(Constantes.PREFERENCES_XML);
			xout.output(doc, arquivo);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void salvaConfiguracoes(Configuracao config){
        Element elemento = new Element(Constantes.XML_CONFIG_ELEMENT);
        Document doc = new Document(elemento);
        
        elemento.removeContent();
		
		Element camadaEsc = new Element(Constantes.XML_QTD_ESCONDIDA_ELEMENT);
		Element epoch = new Element(Constantes.XML_EPOCH_ELEMENT);
		Element erro = new Element(Constantes.XML_ERRO_ELEMENT);
		
		camadaEsc.setText(config.getQtdNeuroniosCamadaEscondida());
		epoch.setText(config.getEpoch());
		erro.setText(config.getErro());
		
		elemento.addContent(camadaEsc);
		elemento.addContent(epoch);
		elemento.addContent(erro);
		
		XMLOutputter xout = new XMLOutputter();
		try {
			FileWriter arquivo = new FileWriter(Constantes.CONFIG_XML);
			xout.output(doc, arquivo);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void salvaSeriais(List<String> listSeriais){
		Element elemento = new Element(Constantes.XML_ROOT_ELEMENT);
//        Element elemento = new Element(Constant.XML_CONFIG_ELEMENT);
        Document doc = new Document(elemento);
		
//        elemento.removeContent();
        
        for (int i = 0; i < listSeriais.size(); i++) {
        	Element serial = new Element(Constantes.XML_SERIAL_ELEMENT);
        	
        	serial.setAttribute("id", Integer.toString(i));
        	serial.setText(listSeriais.get(i).toString());
        	
        	elemento.addContent(serial);
		}
              
		XMLOutputter xout = new XMLOutputter();
		try {
			FileWriter arquivo = new FileWriter(Constantes.SERIAIS_XML);
			xout.output(doc, arquivo);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public Preference selectPreferencesXML() throws JDOMException, IOException{
		SAXBuilder builder = new SAXBuilder();
		Document doc = builder.build(Constantes.PREFERENCES_XML);
		
		Element configElement = doc.getRootElement();		
		
		Preference preference = new Preference();
		
		String idioma = configElement.getChild(Constantes.XML_IDIOMA_ELEMENT).getValue();				
		preference.setIdioma(idioma);
		
//		System.out.println(config.getQtdNeuroniosCamadaEscondida());
//		System.out.println(config.getEpoch());
//		System.out.println(config.getErro());
		
		return preference;
	}
	
	public List<String> selectSeriaisXML() throws JDOMException, IOException{
		SAXBuilder builder = new SAXBuilder();
		Document doc = builder.build(Constantes.SERIAIS_XML);
		
		Element seriaisElement = doc.getRootElement();		
		List<Element> elementosList = seriaisElement.getChildren();
		
		List<String> listSeriais = preencheSeriais(elementosList);
		
//		for (String string : listSeriais) {
//			System.out.println(string);
//		}
		
		return listSeriais;
	}
	
	public Configuracao selectConfiguracoesXML() throws JDOMException, IOException{
		SAXBuilder builder = new SAXBuilder();
		Document doc = builder.build(Constantes.CONFIG_XML);
		
		Element configElement = doc.getRootElement();		
		Configuracao config = preencheTreinamento(configElement);
		
//		System.out.println(config.getQtdNeuroniosCamadaEscondida());
//		System.out.println(config.getEpoch());
//		System.out.println(config.getErro());
		
		return config;
	}
	
	private List<String> preencheSeriais(List<Element> listSeriais){
		if(seriais == null){
			seriais = new ArrayList<String>();
		}
		
		for (Element e : listSeriais) {
			seriais.add(e.getValue());
		}
		
//		setSeriais(seriais);
		return seriais;
	}
	
	private Configuracao preencheTreinamento(Element treinamentoElement){
		Configuracao config = new Configuracao();
		String numNeuroniosEscondida = treinamentoElement.getChild(Constantes.XML_QTD_ESCONDIDA_ELEMENT).getValue();
		String epoch = treinamentoElement.getChild(Constantes.XML_EPOCH_ELEMENT).getValue();
		String erro = treinamentoElement.getChild(Constantes.XML_ERRO_ELEMENT).getValue();
				
		config.setQtdNeuroniosCamadaEscondida(numNeuroniosEscondida);
		config.setEpoch(epoch);
		config.setErro(erro);
		
		return config;
	}
	
	public List<String> getSeriais() {
		return seriais;
	}

	public void setSeriais(List<String> seriais) {
		this.seriais = seriais;
	}
	
	
//	public static void main(String[] args) {
//		PersistenciaXml p = new PersistenciaXml();
//		
//		Configuracao config = new Configuracao();
//		config.setQtdNeuroniosCamadaEscondida("8");
//		config.setEpoch("2000");
//		config.setErro("2");
//		
//		List<String> teste = new ArrayList<String>();
//		teste.add("/dev/ttyUSB0");
//		teste.add("/dev/ttyUSB1");
////		teste.add("/dev/ttyUSB2");
//			
//			try {
////				p.lerSeriaisXML();
//				p.salvaConfiguracoes(config);
//				p.selectConfiguracoesXML();				
////				p.salvaSeriais(teste);
////				p.alteraConfiguracoes();
////				p.alteraSeriais(1, "kkk");
//			} catch (Exception e) {
//				e.printStackTrace();
//			}
//	}
}
